#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
#ifdef __cplusplus
extern "C" {
#endif
btGjkPairDetector* bullet_NewbtGjkPairDetector(btConvexShape* objectA,btConvexShape* objectB,btVoronoiSimplexSolver* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver){
	btConvexShape const * c_arg_objectA=(btConvexShape const *)(void*)(objectA);
	btConvexShape const * c_arg_objectB=(btConvexShape const *)(void*)(objectB);
	btVoronoiSimplexSolver * c_arg_simplexSolver=(btVoronoiSimplexSolver *)(void*)(simplexSolver);
	btConvexPenetrationDepthSolver * c_arg_penetrationDepthSolver=(btConvexPenetrationDepthSolver *)(void*)(penetrationDepthSolver);
	btGjkPairDetector* wrap_out = new btGjkPairDetector(c_arg_objectA,c_arg_objectB,c_arg_simplexSolver,c_arg_penetrationDepthSolver);
	return wrap_out;
}

btGjkPairDetector* bullet_NewbtGjkPairDetector1(btConvexShape* objectA,btConvexShape* objectB,int shapeTypeA,int shapeTypeB,double marginA,double marginB,btVoronoiSimplexSolver* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver){
	btConvexShape const * c_arg_objectA=(btConvexShape const *)(void*)(objectA);
	btConvexShape const * c_arg_objectB=(btConvexShape const *)(void*)(objectB);
	int c_arg_shapeTypeA=shapeTypeA;
	int c_arg_shapeTypeB=shapeTypeB;
	btScalar c_arg_marginA=marginA;
	btScalar c_arg_marginB=marginB;
	btVoronoiSimplexSolver * c_arg_simplexSolver=(btVoronoiSimplexSolver *)(void*)(simplexSolver);
	btConvexPenetrationDepthSolver * c_arg_penetrationDepthSolver=(btConvexPenetrationDepthSolver *)(void*)(penetrationDepthSolver);
	btGjkPairDetector* wrap_out = new btGjkPairDetector(c_arg_objectA,c_arg_objectB,c_arg_shapeTypeA,c_arg_shapeTypeB,c_arg_marginA,c_arg_marginB,c_arg_simplexSolver,c_arg_penetrationDepthSolver);
	return wrap_out;
}

btVector3* bullet_btGjkPairDetector_getCachedSeparatingAxis(btGjkPairDetector* c_this){
	btVector3 const& c_out = c_this->getCachedSeparatingAxis();
	btVector3* wrap_out = (btVector3*)(&c_out);
	return wrap_out;
}

double bullet_btGjkPairDetector_getCachedSeparatingDistance(btGjkPairDetector* c_this){
	btScalar c_out = c_this->getCachedSeparatingDistance();
	double wrap_out = (c_out);
	return wrap_out;
}

void bullet_btGjkPairDetector_getClosestPointsNonVirtual(btGjkPairDetector* c_this,btDiscreteCollisionDetectorInterface::ClosestPointInput* input,btDiscreteCollisionDetectorInterface::Result* output,btIDebugDraw* debugDraw){
	btDiscreteCollisionDetectorInterface::ClosestPointInput const& c_arg_input=(btDiscreteCollisionDetectorInterface::ClosestPointInput const&)(*input);
	btDiscreteCollisionDetectorInterface::Result& c_arg_output=(btDiscreteCollisionDetectorInterface::Result&)(*output);
	btIDebugDraw * c_arg_debugDraw=(btIDebugDraw *)(void*)(debugDraw);
	c_this->getClosestPointsNonVirtual(c_arg_input,c_arg_output,c_arg_debugDraw);
}

int bullet_btGjkPairDetector_GetFieldOfM_catchDegeneracies(btGjkPairDetector* c_this){
	return (int)(c_this->m_catchDegeneracies);
}

int bullet_btGjkPairDetector_GetFieldOfM_curIter(btGjkPairDetector* c_this){
	return (int)(c_this->m_curIter);
}

int bullet_btGjkPairDetector_GetFieldOfM_degenerateSimplex(btGjkPairDetector* c_this){
	return (int)(c_this->m_degenerateSimplex);
}

int bullet_btGjkPairDetector_GetFieldOfM_fixContactNormalDirection(btGjkPairDetector* c_this){
	return (int)(c_this->m_fixContactNormalDirection);
}

int bullet_btGjkPairDetector_GetFieldOfM_lastUsedMethod(btGjkPairDetector* c_this){
	return (int)(c_this->m_lastUsedMethod);
}

void bullet_btGjkPairDetector_setCachedSeparatingAxis(btGjkPairDetector* c_this,btVector3* separatingAxis){
	btVector3 const& c_arg_separatingAxis=(btVector3 const&)(*separatingAxis);
	c_this->setCachedSeparatingAxis(c_arg_separatingAxis);
}

void bullet_btGjkPairDetector_setIgnoreMargin(btGjkPairDetector* c_this,bool ignoreMargin){
	bool c_arg_ignoreMargin=ignoreMargin;
	c_this->setIgnoreMargin(c_arg_ignoreMargin);
}

void bullet_btGjkPairDetector_setMinkowskiA(btGjkPairDetector* c_this,btConvexShape* minkA){
	btConvexShape const * c_arg_minkA=(btConvexShape const *)(void*)(minkA);
	c_this->setMinkowskiA(c_arg_minkA);
}

void bullet_btGjkPairDetector_setMinkowskiB(btGjkPairDetector* c_this,btConvexShape* minkB){
	btConvexShape const * c_arg_minkB=(btConvexShape const *)(void*)(minkB);
	c_this->setMinkowskiB(c_arg_minkB);
}

void bullet_btGjkPairDetector_setPenetrationDepthSolver(btGjkPairDetector* c_this,btConvexPenetrationDepthSolver* penetrationDepthSolver){
	btConvexPenetrationDepthSolver * c_arg_penetrationDepthSolver=(btConvexPenetrationDepthSolver *)(void*)(penetrationDepthSolver);
	c_this->setPenetrationDepthSolver(c_arg_penetrationDepthSolver);
}

#ifdef __cplusplus
}
#endif
